
package models;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.joda.time.Period;

import play.data.validation.Required;
import play.db.jpa.Model;

@Entity
public class Event extends Model{
	@Required
	public String name;
	@Required
	public Date begin;
	@Required
	public Date end;
	
	@Required
	@ManyToOne
	public User author;
	
	@ManyToMany
	public List<User> participants;


	@OneToMany(mappedBy="event",cascade=CascadeType.ALL)
	public List<Comment> comments;
	public Event() {
		// TODO Auto-generated constructor stub
		participants = new ArrayList();
		comments = new ArrayList();
	}

	public Event addComment(String author,String Content){
		Comment c = new Comment(author, this, Content).save();
		this.comments.add(c);
		this.save();
		return this;
	}

	/**
	 * Donne les heures de début de la réunion
	 * @return Les heures et les minutes
	 */
	public String getFormattedStartAt() {

		DateTime dtStartAt = new DateTime(this.begin);
		String hour = String.format("%02d",dtStartAt.hourOfDay().get());
		String minutes = String.format("%02d",dtStartAt.minuteOfHour().get());
		return  hour + ":" + minutes;
	}
	/**
	 * Donne l'heure de fin de la réunion 
	 * @return les heures et les minutes de fin
	 */
	public String getFormattedEndAt() {
		DateTime dtEndAt = new DateTime(this.end);
		String hour = String.format("%02d",dtEndAt.hourOfDay().get());
		String minutes = String.format("%02d",dtEndAt.minuteOfHour().get());
		return hour + ":" + minutes;
	}

	/**
	 * Donne le jour de debut de la réunion 
	 * 
	 * @return le jour de début de la réunion day-
	 */
	public  String getDayClass() {
		DateTime dtStartAt = new DateTime(this.begin);
		return "day-" + dtStartAt.dayOfWeek().get()+"-"+dtStartAt.dayOfWeek().getAsText();
	}
	public String affichage () {
		DateTime dtStartAt = new DateTime(this.begin);
		return dtStartAt.dayOfWeek().getAsText() + " "+ dtStartAt.dayOfMonth().getAsText()+ " "+dtStartAt.monthOfYear().getAsText();
	}

	/**
	 * Donne l'heure de début de la réunion 
	 * @return l'heure et les minutes du début de la réunion 
	 */
	public String getHourClass() {
		DateTime dtStartAt = new DateTime(this.begin);
		return "hour-" + dtStartAt.hourOfDay().get() + "-" + dtStartAt.minuteOfHour().get();
	}

	/**
	 * Donne la durée de la réunion en heures et en  minutes
	 * @return la durée de la réunion en heure et minutes
	 */
	public  String getDuringClass() {
		Interval interval = new Interval(this.begin.getTime(),this.end.getTime());
		Period period = interval.toPeriod();
		return period.getHours() + "-" +period.getMinutes();
	}

	/***
	 *  retourne la date de la réunion  
	 * @return JJ/MM/AAAA
	 */
	public  String getFormattedDate() {
		DateTime dtStartAt = new DateTime(this.begin);
		return dtStartAt.dayOfMonth().get() + "/" + dtStartAt.monthOfYear().get() + "/" + dtStartAt.year().get();
	}
	

	/**
	 * 
	 * @param name
	 * @param begin
	 * @param heureBegin
	 * @param heureEnd
	 * @param email
	 * @return true si l'evenement peut etre créée et false sinon
	 */
	public boolean set(String name, String begin, String heureBegin, String heureEnd,String email)
	{
		String[] splitDay = begin.split("-");
		int year = Integer.parseInt(splitDay[0]);
		int month = Integer.parseInt(splitDay[1]);
		int day = Integer.parseInt(splitDay[2]);
		//****************************************************

		String [] splitHour = heureBegin.split(":");
		int hour = Integer.parseInt(splitHour[0]);
		int min = Integer.parseInt(splitHour[1]);

		//*************************************************************
		String[] splitEnd= heureEnd.split(":");
		int hourEnd =Integer.parseInt(splitEnd[0]);
		int minEnd = Integer.parseInt(splitEnd[1]);

		DateTime beginAtB = new DateTime(year, month, day, hour, min);
		DateTime endAtB = new DateTime(year, month, day, hourEnd, minEnd);
		//******************************
		//Date beginAt = beginAtB.toDate();
		//Date endAt = endAtB.toDate();

		//********************************************************************
		if(beginAtB.toDate().getTime() < endAtB.toDate().getTime())
		{
			this.name = name;
			this.begin = beginAtB.toDate();
			this.end = endAtB.toDate();
			
			User user =((User) models.User.find("byEmail",name).first());
			user.setCreatedEvents(this);
			user.save();
			this.author = user;

			return true;
		}
		else {
			return false;
		}
	}


	public boolean addParticipants(User userCourant,User aAjouter)
	{
		// on veut vérifier que l'utilisateur courant est l'autheur
		String msg="";
		if(this.author.equals(userCourant)){
			if(participants.contains(aAjouter))
			{
				this.participants.add(aAjouter);
				aAjouter.setParticipation(this);

			}else
			{
				msg = "pariticipants existe déjà";
			}

			return true;
		}
		return false;
	}
	public boolean addParticipants(List<User> e)
	{
		// on veut vérifier que l'utilisateur courant est l'autheur
		for (User u : e)
		{
				this.participants.add(u);
				u.setParticipation(this);
				u.save();

		}
			return true;
	}
	
}
